package dfs;

//给定一个二维网格和一个单词，找出该单词是否存在于网格中。
//单词必须按照字母顺序，通过相邻的单元格内的字母构成，其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。
// 同一个单元格内的字母不允许被重复使用。
//

public class 单词搜索 {
    public static void main(String[] args) {
        char[][] board={{'a','b','c','e'}, {'s','f','c','s'},{'a','d','e','e'}};
        String word="abcced";
        boolean exist = exist(board, word);
        System.out.println(exist);
    }
    public static boolean exist(char[][] board, String word) {
        char[] chars = word.toCharArray();
        for (int i = 0; i < board.length; i++) {
            for (int j = 0; j < board[0].length; j++) {
                if(backtrace(board,chars,i,j,0))
                    return true;
            }
        }
        return false;
    }
    private static boolean backtrace(char[][] board, char[] chars, int i, int j, int len) {
        //边界条件
        if (i>=board.length || i<0 || j>board[0].length || j<0 || board[i][j]!=chars[len])
            return false;
        if (len==chars.length-1)
            return true;
        //记录当前位置的值
        char cur=board[i][j];
        board[i][j]='.';
        //上下左右找
        boolean res=(backtrace(board,chars,i-1,j,len+1) || backtrace(board,chars,i+1,j,len+1)||
                backtrace(board,chars,i,j-1,len+1) ||backtrace(board,chars,i,j+1,len+1));
        //将值复原
        board[i][j]=cur;
        return res;
    }
}
